효과적인 흐름 제어를 위한 고도의 Modular RAG 기법 - 테디노트

GENCON 2024 AI Conference for DEV

TOC

  1. RAG 패러다임의 변화: Naive RAG -> Advanced RAG -> Modular RAG
  2. Modular RAG 소개
  3. LangGraph
  4. Modular RAG Patterns
  5. Modular RAG 적용사례

Why RAG?

RAG가 등장하게 된 배경

LLM은 다음과 같은 문제를 가지고 있다.

  1. 할루시네이션
    • 할루시네이션은 모델이 잘못된 정보를 자신감 있게 제시
  2. 최신 정보의 반영 안됨
    • 대규모 언어 모델의 학습과정이 복잡하고 시간과 리소스가 많이 소요됨
    • 모델의 지식은 학습 데이터의 컷오프 날짜에 제한되어 있고, 실시간 업데이트가 어렵기 때문에 최신 정보 반영이 지연된다.
  3. 도메인 특화
    • 일반적인 LLM은 광범위한 지식을 다루지만, 특정 기업이나 조직의 고유한 정보는 포함하지 않음
    • 기업 특화 정보를 활용하기 위해서는 추가적인 파인튜닝이나 맞춤형 학습이 필요
  4. 지식의 불분명한 출처
    - LLM은 학습 데이터에서 얻은 정보를 종합하여 답변을 생성하므로, 특정 정보의 정확한 출처를 제시하기 어려움

RAG란?

Retrieval(검색) - Augmented(증강) - Generation(생성)

RAG 효과

출처: 풀파인튜닝, PEFT, 프롬프트 엔지니어링 및 RAG: 어떤 것이 나에게 적합할까?

구축 및 유지보수 비용 구축의 복잡성
07c58e342a6a3e16adfe2b76a4de7993_MD5.jpg b24ce2875ed236e4c5df37860748e90f_MD5.jpg
도메인별 용어 특화 최신 정보로 답변
d75d5c34a2ac828918c0600cae63de01_MD5.jpg a373ee0aa2d42ed68c2e80bd78cf7cbb_MD5.jpg
답변 과정의 투명성 및 해석 가능성 할루시네이션 감소
d599f81fb90da0649dcca37f3174a8c0_MD5.jpg ae39f56b6e21706c1b873424e581c5f8_MD5.jpg

대표적인 RAG 방법론

출처: https://arxiv.org/pdf/2312.10997v1

b7a09e84e5b3dda5bd75d219dd6ea13b_MD5.png

RAG의 패러다임 변화

이전 방법론의 한계를 뛰어넘을 수 있는 여러가지 시도

Naive RAG

출처: https://python.langchain.com/v0.1/docs/use_cases/question_answering/

2aa138166518fc85d5c627f77a7859c6_MD5.png

검색(Retrieve) - 읽기(Read) 프레임워크

사전 단계

  1. Indexing: PDF, Word, Markdown 등에서 텍스트 데이터 추출
  2. Chunking: 작은 단위로 분할
  3. Embedding: Vector로 인코딩
  4. Database: 임베딩된 Vector를 DB에 저장

실행 단계

be465f5a2d6e4af34fe109d620085a24_MD5.png

  1. Retrieve: Database 에서 질문(Query)에 답변하기 위한 정보 검색
  2. Generation: 검색된 정보를 문맥(Context)에 추가하여 답변 생성
  1. 쿼리에 대한 얕은 이해
    • 쿼리와 문서 Chunk 사이의 의미론적 유사성이 항상 일치하는 것은 아님
    • 검색을 위해 유사도 계산에만 의존하는 것은 쿼리와 문서간의 관계에 대한 심층적인 탐색이 부족
  2. 검색 중복 및 노이즈
    • 검색된 모든 Chunk를 LLM에 직접 공급하는 것이 항상 유익한 것은 아님
    • 연구에 따르면 중복되고 노이즈가 많은 정보는 LLM가 핵심정보를 식별하는데 방해가 되어 잘못된 응답을 생성(Hallucination) 할 위험이 높아질 수 있음

Advanced RAG

출처: https://arxiv.org/pdf/2407.21059v1

e491a767eb68f84af8a7596cbb1d163b_MD5.png

이전의 Naive RAG 가 가지고 있었던 한계를 극복하기 위한 다양한 고급 방법론

  1. Indexing
    • 계층적 구조의 Indexing
    • Semantic Chunking
  2. Pre-Retrieval
    • Query Rewrite, Query Expansion
    • Query Transformation
  3. Retrieval
    • Hybrid Search(키워드 검색 + 시맨틱 검색)
  4. Post-Retrieval
    • Reranker, Reorder

Indexing

  1. Metadata
    • metadata에 연도,출처(파일명,URL)등 을 추가
    • Self-Query Retriever: Query 문으로 데이터 필터링에 활용
  2. Summary, Entity 등 추가 정보 생성 후 Indexing
    • 추상적인 질문에는 Summary/Entity 활용
    • 구체적인 질문에는 작은 Chunk 활용
    • e6ba2a4c03698185926b15fd66516749_MD5.png
  3. Hierarchical Structure
    • 16bcab7ed517e2023343f9a4d41a35ae_MD5.png|400 출처: https://arxiv.org/pdf/2407.21059v1
    • 계층적 구조로 검색 범위를 좁히고, 대신 검색 Depth를 늘린다.
      • Multi-hop 질문의 경우 노드 간의 관계를 활용하여 정확도를 향상한다.
      • Multi-hop Question란? 답변을 얻기 위해 여러 단계의 추론이나 정보 조합이 필요한 복잡한 질문 유형을 의미한다.
  4. Hybrid Indexing
    • Relational Database + Vector Database
      • RDB
        • 구조화된 데이터를 저장
        • 사용자의 질문 기반 필터링/대화 내용 저장
      • Vector DB
        • 문서 내용 기반 유사도 검색에 활용

Chunking Strategy

Pre-Retrieval

3b24c5b85127a7dcc3cdc1d27fda10e1_MD5.png|300

Retrieval

Post-Retrieval

Advanced RAG의 한계

고급 RAG의 실용성이 개선되었음에도 불구하다.
기능과 실제 애플리케이션 요구 사항 사이에는 여전히 격차가 존재한다.

프로덕션(Production)의 어려움

Linear Structured RAG의 한계

Naive RAG, Advanced RAG 모두 단방향 구조의 RAG이다

Document Loader(데이터로드) -> Answer(답변)

38265acfea4287da6fe88381df3a01c1_MD5.png|600

Modular RAG

출처: https://arxiv.org/pdf/2407.21059

LEGO와 같은 재구성 용이하고 보다 유연한 흐름을 만들 수 있는 프레임워크

모듈

모듈, 하위 모듈 및 운영자로 구성된 아키텍처 설계를 통해 통합되고 구조화된 방식으로 RAG 시스템을 정의한다.

c8d4bfc48350b3291f164666795fab4b_MD5.png

독립적인 모듈 구성

동일한 형태의 입력과 출력을 반환하는 Interface을 작성한다.

def custom_retriever(data: RagData) -> RagData: 
	# 커스텀 retrieve 로직 구현
	...
return data
def request_private_api(data: RagData) -> RagData: 
	# API 호출 로직 구현
	...
return data

조립형 모듈

마치 LEGO 블록처럼 세부 모듈(Sub-Module) 을 연결하여 구성할 수 있다.

독립적인 모듈의 장점을 활용할 수 있다.

그래프 형식의 동적 흐름 구성

4800b802e62dcbc6aa18c0e902e9dac0_MD5.png

b9bfe5cdf3444b5ad70942835b95d8e9_MD5.png

afabf01eee5ac01e80ad6c752a43d9e1_MD5.png

LangGraph

https://github.com/langchain-ai/langgraph

워크플로우(Workflow)를 만드는 데 사용한다.

상태 저장, 멀티 액터(Multi-Actor) 애플리케이션을 구축에 용이한 라이브러리이다.

핵심 기능

주요 구성 요소

5fa12d270dd6975a156c8e865b93764e_MD5.png|500

LangGraph 구현 예시

0f7150e08f693396220ded2371364c73_MD5.png|600

Modular RAG Patterns

Linear Pattern

출처: https://arxiv.org/pdf/2407.21059

998432432aab6bb4e960ed76ac97f979_MD5.png

3fec808e9ffabd9aeaf74871d2c2611b_MD5.png

Conditional Pattern - Routing

9e2cbef03cebe6b5e6922311d8014d88_MD5.png

Branching Pattern

558574499773a6e7ddd829133b9f8e48_MD5.png

9aff21ca5c48008908ab23d2745ee2c9_MD5.png

Loop Pattern

Iterative N Pattern

반복적인 검색 - 생성 과정을 통해 복잡한 질문에 대한 답변의 품질을 향상한다.

동작 방식

  1. 검색(Retrieval)과 생성(Generation)단계를 여러번 반복
  2. 미리 정해진 최대 반복횟수(N)까지 프로세스를 반복
  3. 각 반복마다 이전 출력을 활용하여 더 관련성 높은 정보를 검색하고 답변을 개선

8bdb2051c83351a83b228bcf253a1241_MD5.png

ITER-RETGEN

https://arxiv.org/pdf/2305.15294

Generation Augmented Retrieval(GAR)

  1. 검색된 문서 기반 LLM 답변 생성
  2. 생성된 답변을 Query와 결합하여 검색 수행
  3. 새롭게 검색된 문서 기반으로 LLM 답변 생성
  4. N회 반복 후 최종 답변 도출

dcf2bdebab76b36dca5d51d9bcb773e6_MD5.png

Tree of Clarification

  1. 각 노드에서 LLM 은 해당 질문에 대한 답변 생성(w/ Ambiguous Question)
  2. Question Clarfication 을 위한 하위 노드 추가(Disambiguous Question)
  3. 관련없는 노드 pruning/관련성 있는 정보만 남김
  4. 생성한 정보를 종합하여 Long Form 답변 생성

1119af4769e35662c9d1b5fcf1677428_MD5.png

Adaptive Retrieval Pattern

Retrieval 전 단계에서 Retrieval 과정이 필요한지를 판단

동작 방식

검색(Retrieval)이 필요한 질문인지 판단

  1. 검색이 필요하지 않은 경우 -> 즉각답변생성
  2. 검색이 필요한 경우 -> ITER-N 혹은 Recursive Retrieval Pattern 실행

972c73833ded96c8857c4e6705577f7d_MD5.png|600

Adaptive Pattern

Forward-Looking Active Retrieval (FLARE)

d259752655dfc60ba83f082c8221f417_MD5.png|600

동작방식

  1. 쿼리 입력
  2. 모델이 토큰을 생성하며 다음 문장을 반복적으로 예측
  3. 모델이 생성한 답변이 confidence 가 낮다면, 생성된 문장을 Query 로 문서 재검색
  4. 재검색한 문서+생성한 문장을 입력으로 새로운 답변 생성
  5. 응답이 완성될 때까지 2~4Step을 반복 수행

응용한 Self-Reflective RAG

논문: https://arxiv.org/pdf/2310.11511

Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection을 응용한 버전이다.
Self-RAG 논문에서는 reflection 토큰으로 retrieval 하는 시기를 판단한 다음 -> LLM as a Judge 로 대체한다.

fa0acd243c3bf08a6ecfac7f9bd6a1df_MD5.png

동작 방식

  1. 문서 Retrieval 후 관련성 평가
  2. 관련성이 있다면 답변생성, 관련성이 없다면 QueryRewrite 후 Step1 진행
  3. 답변에 대한 Hallucination 평가
  4. Hallucination 판별 시 답변 재생성, 없다면 Relevance 체크
  5. RelevanceCheck 통과 시 최종 답변, 실패시 QueryRewrite 후 step1 진행

그 밖의 수많은 RAG 패턴들

Modular RAG 적용 사례: 복잡한 구조의 문서 처리

Graph Parser Modular - 주요 기능

일반 텍스트 처리

표, 이미지 처리

50fa1e529b47cbb7e8bbe19b4c36ee7c_MD5.png|600

Graph Parser Modular - Base 노드 & 상속

  1. BaseNode 상속
  2. abstractmethod 구현

920a9906e435eba936729cd175b8d051_MD5.png

df8e155eb4901b8968225284b607a01b_MD5.png|400

⬇️ 상속

e852e850443f137cfee834be6c0cfe94_MD5.png|500

Graph Parser Modular - 기능별로 분리(재사용)

4668c6defe14f44af5dc17914786f252_MD5.png

Graph Parser Modular - 그래프 정의

Pasted image 20241004120445.png

Graph Parser Modular - 흐름 및 다양한 테스트

Pasted image 20241004120517.png

텍스트 추출

7005a2f08bfc687d9f4b4dc33ddef3be_MD5.png

표(Table) 추출

표의 Summary & Entity 추출시, 앞 뒤 문맥(Context) 을 입력으로 주어 보다 정교한 인사이트를 추출할 수 있도록 함

Pasted image 20241004120614.png

이미지 추출

Pasted image 20241004120636.png

요약

LLM의 발전은 소프트웨어 개발에서 완전히 새로운 문제에 접근할 수 있다는 점에서 놀랍습니다.

하지만, 이를 충분히 활용하려면 문제를 해결하기 위해
쪼갤 수 있는 가장 작은 단위로 나누고
작은 단위의 모듈이 작은 범위의 작업에 집중할 수 있도록 해야 합니다.

모듈식 접근 방식은 단순한 기능 외에도
전체 시스템을 접근하기 어려운 블랙박스로 만들지 않고
개별 구성 요소를 디버깅하고 반복할 수 있는 기능을 제공합니다.

RAG 설계에는 다양한 방법론들이 존재하고, 때로는 창의적 접근이 필요한 분야입니다.

LLM의 성능 개선과 토큰 비용 절감은
LLM을 답변 생성의 기능이 아닌 평가자(Judge), 라우터(Router) 와 같이 RAG의 하나의 기능으로 활용하게 되면서 더 창의적인 방법론들이 제시될 전망입니다.

정해진 최적의 해는 없기 때문에 지속적인 실험과 시행착오가 경쟁력 입니다.
그리고, RAG의 각 세부 기능을 Module 화 해야 수 많은 실험을 체계적으로 시행할 수 있습니다.

관련 영상